package ar.com.seminario.model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import ar.com.seminario.common.domain.entity.Identifiable;

/**
 * Detalla a un candidato.
 * 
 * @author Pablo Lamas
 * 
 */
@Entity
@Table(name = "candidato")
public class Candidato implements Identifiable<Long>{

	/**
	 * Identificador de la entidad.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id", nullable = false)
	private Long id;

	/**
	 * Apellido del candidato.
	 */
	@Column(name = "apellido", nullable = false)
	private String apellido;

	/**
	 * Nombre del candidato.
	 */
	@Column(name = "nombre", nullable = false)
	private String nombre;

	/**
	 * Fecha de nacimiento.
	 */
	@Column(name = "fecha_nacimiento", nullable = false)
	private Date fechaNacimiento;

	/**
	 * Direccion del afiliado.
	 */
	@Column(name = "direccion", nullable = false)
	private String direccion;

	/**
	 * Remuneracion Pretendida.
	 */
	@Column(name = "remuneracion_pretendida", nullable = false)
	private Float remuneracionPretendida;

	/**
	 * Presentacion General del candidato.
	 */
	@Column(name = "presentacion_general", nullable = false)
	private String presentacionGeneral;

	/**
	 * Expresion verbal del candidato.
	 */
	@Column(name = "expresion_verbal", nullable = false)
	private String expresionVerbal;

	/**
	 * Motivo para cambio del candidato.
	 */
	@Column(name = "motivo_para_cambio", nullable = false)
	private String motivoParaCambio;

	/**
	 * Condicion laboral del cambio.
	 */
	@Column(name = "condiciones_laboral_actual", nullable = false)
	private String condicionesLaboralActual;

	/**
	 * Disponibilidad de ingreso.
	 */
	@Column(name = "disponibilidad_ingreso", nullable = false)
	private String disponibilidadIngreso;

	/**
	 * Disponibilidad para viajar.
	 */
	@Column(name = "disponibilidad_para_viajar", nullable = false)
	private String disponibilidadParaViajar;

	/**
	 * Lista de Propuesta de ingreso hechas al candidato.
	 */
	@OneToMany(mappedBy = "candidato", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
	private List<PropuestaIngreso> propuestasIngreso;

	/**
	 * El perfil del candidato.
	 */
	@OneToOne
	@JoinColumn(name = "perfil_id", nullable = true)
	private Perfil perfil;

	/**
	 * Constructor por defecto.
	 */
	public Candidato() {

	}

	public Long getId() {
		return id;
	}

	protected void setId(Long id) {
		this.id = id;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Date getFechaNacimiento() {
		return fechaNacimiento;
	}

	public void setFechaNacimiento(Date fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public Float getRemuneracionPretendida() {
		return remuneracionPretendida;
	}

	public void setRemuneracionPretendida(Float remuneracionPretendida) {
		this.remuneracionPretendida = remuneracionPretendida;
	}

	public String getPresentacionGeneral() {
		return presentacionGeneral;
	}

	public void setPresentacionGeneral(String presentacionGeneral) {
		this.presentacionGeneral = presentacionGeneral;
	}

	public String getExpresionVerbal() {
		return expresionVerbal;
	}

	public void setExpresionVerbal(String expresionVerbal) {
		this.expresionVerbal = expresionVerbal;
	}

	public String getMotivoParaCambio() {
		return motivoParaCambio;
	}

	public void setMotivoParaCambio(String motivoParaCambio) {
		this.motivoParaCambio = motivoParaCambio;
	}

	public String getCondicionesLaboralActual() {
		return condicionesLaboralActual;
	}

	public void setCondicionesLaboralActual(String condicionesLaboralActual) {
		this.condicionesLaboralActual = condicionesLaboralActual;
	}

	public String getDisponibilidadIngreso() {
		return disponibilidadIngreso;
	}

	public void setDisponibilidadIngreso(String disponibilidadIngreso) {
		this.disponibilidadIngreso = disponibilidadIngreso;
	}

	public String getDisponibilidadParaViajar() {
		return disponibilidadParaViajar;
	}

	public void setDisponibilidadParaViajar(String disponibilidadParaViajar) {
		this.disponibilidadParaViajar = disponibilidadParaViajar;
	}

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public boolean addPropuestaIngreso(PropuestaIngreso propuestaIngreso) {

		if (this.propuestasIngreso == null) {
			this.propuestasIngreso = new ArrayList<PropuestaIngreso>();
		}

		if (propuestaIngreso != null) {
			propuestaIngreso.setCandidato(this);
		}

		return this.propuestasIngreso.add(propuestaIngreso);
	}

	public boolean removePropuestaIngreso(PropuestaIngreso propuestaIngreso) {

		if (this.propuestasIngreso == null) {
			return (false);
		} else {
			return this.propuestasIngreso.remove(propuestaIngreso);
		}
	}

	public List<PropuestaIngreso> getAllPropuestasIngreso() {

		if (this.propuestasIngreso == null) {
			return null;
		} else {
			return Collections.unmodifiableList(this.propuestasIngreso);
		}
	}

}
